【问题标题】:XML to JSON Conversion with Conditions带条件的 XML 到 JSON 转换
【发布时间】:2017-10-14 23:56:07
【问题描述】:

想要将一个 xml 字符串转换为 Json,我正在按照以下方式进行操作。

需要转换的XML

<Item>
    <Property name="Description" value="Description 1"/>
    <Property name="EffDate" value="01/05/2017"/>
    <Property name="ExpDate" value="12/31/9999"/>
    <Property name="Status" value="Launched"/>
</Item>  

我已经为 xml 创建了一个类,如下所示。

public class Context {  
    @XmlElement(name = "Item")
    private List<Item> offer;
}

public class Item { 
    @XmlElement(name = "Property")
    private List<Property> properties;
}

public class Property {
    @XmlAttribute
    private String name;

    @XmlAttribute
    private String value;
}

我正在使用 Gson 库将此 Java 对象转换为 Json - g.toJson。

转换后的 JSON -

   "offer": [{
   "properties": [{
                "name": "Description",
                "value": "Description 1"
            },
            {
                "name": "EffDate",
                "value": "01/05/2017"
            },
            {
                "name": "ExpDate",
                "value": "12/31/9999"
            },
            {
                "name": "Status",
                "value": "Launched"
            }]
         }]

但我们想将 JSON 转换如下 -

"offer": [{
     "Description" : "Description 1",
     "EffDate":"01/05/2017",
     "ExpDate": "12/31/9999",
     "Status": "Launched"
    }]

有没有办法将属性名称和值转换为 Item 类属性?

【问题讨论】:

    标签: java json xml


    【解决方案1】:

    尝试使用此链接:https://github.com/stleary/JSON-java 这是一个 JSON Helper 类,可以将 XML 转换为 JSON,例如:

    public class Main {
    
        public static int PRETTY_PRINT_INDENT_FACTOR = 4;
        public static String TEST_XML_STRING =
            "<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to JSON</test>";
    
        public static void main(String[] args) {
            try {
                JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
                String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
                System.out.println(jsonPrettyPrintString);
            } catch (JSONException je) {
                System.out.println(je.toString());
            }
        }
    }
    

    希望这会有所帮助:)

    【讨论】:

    • 有没有办法将属性名称和值转换为 Item 类属性。?如上图
    【解决方案2】:

    可以使用FasterXML 库。您可以在其中编写用于生成 XML 和 JSON 的自定义逻辑。通过覆盖 JsonSerializer 类的 serialize

    需要像这样写序列化器:

    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import java.io.IOException;
    
    public class ContextSerializer extends JsonSerializer<Context> {
        @Override
        public void serialize(Context t, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException {
            jg.writeStartObject();
            jg.writeArrayFieldStart("offer");
            for (Item i : t.offer) {
                jg.writeStartObject();
                for (Property property : i.properties) {
                    jg.writeStringField(property.name, property.value);
                }
                jg.writeEndObject();
            }
            jg.writeEndArray();
            jg.writeEndObject();
        }
    }
    

    对于转换:

    import com.fasterxml.jackson.annotation.JsonInclude.Include;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.bind.JAXBException;
    
    public class Main {
        public static void main(String[] args) throws JAXBException, JsonProcessingException {
            Context c = new Context();
            List<Item> offer = new ArrayList<>();
            Item pr = new Item();
            pr.properties = new ArrayList<>();
    
            Property p = new Property();
            p.name = "asdf";
            p.value = "va1";
            pr.properties.add(p);
    
            p = new Property();
            p.name = "asdf1";
            p.value = "va11";
            pr.properties.add(p);
    
            offer.add(pr);
            c.offer = offer;
            try {
                SimpleModule module = new SimpleModule();
                module.addSerializer(Context.class, new ContextSerializer());
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.registerModule(module);
                objectMapper.setSerializationInclusion(Include.NON_DEFAULT);
                String json = objectMapper.writeValueAsString(c);
                System.out.println(json);
            } catch (Exception e) {
                System.out.println(""+e);
            }
        }
    }
    

    O/P JSON :(如果您将名称提供给列表(“offer”),则提供的 O/P JSON 在您的问题中是错误的,那么它总是在对象 link 中)

    {
        "offer": [{
                "asdf": "va1",
                "asdf1": "va11"
            }
        ]
    }
    

    Maven 依赖包是:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.0.pr3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.0.pr3</version>
    </dependency>
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 Java 8 或更高版本,您应该查看我的开源库:unXml。 unXml 基本上是从 Xpath 映射到 Json 属性。

      Maven Central 上可用。

      例子

      import com.fasterxml.jackson.databind.node.ObjectNode;
      import com.nerdforge.unxml.factory.ParsingFactory;
      import com.nerdforge.unxml.parsers.Parser;
      import org.w3c.dom.Document;
      
      public class Parser {
        public ObjectNode parseXml(String xml){
          Parsing parsing = ParsingFactory.getInstance().create();
          Document document = parsing.xml().document(xml);
      
          Parser<ObjectNode> parser = parsing.obj("/")
              .attribute("offer", parsing.arr("/Item")
                  .attribute("Description", "Property[@name='Description']/@value")
                  .attribute("EffDate", "Property[@name='EffDate']/@value")
                  .attribute("ExpDate", "Property[@name='ExpDate']/@value")
                  .attribute("Status", "Property[@name='Status']/@value")
              )
              .build();
      
          ObjectNode result = parser.apply(document);
          return result;
        }
      }
      

      它将返回一个JacksonObjectNode,带有以下json:

      {
        "offer": [
          {
            "Status": "Launched",
            "Description": "Description 1",
            "ExpDate": "12/31/9999",
            "EffDate": "01/05/2017"
          }
        ]
      }
      

      【讨论】:

        【解决方案4】:

        您可以将 xml 转换为地图,对其进行修改,然后再转换为 json。 Underscore-java 库有静态方法 U.fromXml(xml)U.toJson(json)。我是项目的维护者。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-24
          • 2014-01-17
          • 1970-01-01
          • 2012-08-16
          • 2021-01-30
          • 2019-01-23
          • 1970-01-01
          相关资源
          最近更新 更多